//解码顶层
module decode_top(
//时钟复位
i_clk,
i_rst_n,
//解码使能
i_decode_en,
//输入数据
i_decode_data,
//解码完成和错误
o_decode_finish,
o_decode_error,
//输出地址数据
o_decode_addr,
o_decode_data
);

//时钟复位
input         i_clk;
input         i_rst_n;
//解码使能
input         i_decode_en;
//输入数据
input  [31:0] i_decode_data;
//解码完成和错误
output        o_decode_finish;
output        o_decode_error;
//输出地址数据
output [8:0]  o_decode_addr;
output [31:0] o_decode_data;

//校验结果、校验方程、解码控制器、迭代计数器
wire [3:0]    check_ok;
wire [1023:0] check_ok_all;
wire [8:0]    decode_cnt;
wire [5:0]    err_cnt;
//dpram读地址
wire [8:0]    cn_r_addr;
//上次后验信息（出dpram）
wire [511:0]  lr_last;
//c2v
wire [15:0]   c2v_0;
wire [15:0]   c2v_1;
wire [15:0]   c2v_2;
wire [15:0]   c2v_3;
wire [15:0]   c2v_4;
wire [15:0]   c2v_5;
wire [15:0]   c2v_6;
wire [15:0]   c2v_7;
//校验v2c
wire [15:0]   v2c_check_0;
wire [15:0]   v2c_check_1;
wire [15:0]   v2c_check_2;
wire [15:0]   v2c_check_3;
wire [15:0]   v2c_check_4;
wire [15:0]   v2c_check_5;
wire [15:0]   v2c_check_6;
wire [15:0]   v2c_check_7;
//迭代v2c
wire [15:0]   v2c_ite_0;
wire [15:0]   v2c_ite_1;
wire [15:0]   v2c_ite_2;
wire [15:0]   v2c_ite_3;
wire [15:0]   v2c_ite_4;
wire [15:0]   v2c_ite_5;
wire [15:0]   v2c_ite_6;
wire [15:0]   v2c_ite_7;
//这次后验信息（入dpram）
wire [511:0]  lr_next;
//h阵数值c2v
wire [15:0]   h2c_0;
wire [15:0]   h2c_1;
wire [15:0]   h2c_2;
wire [15:0]   h2c_3;
wire [15:0]   h2c_4;
wire [15:0]   h2c_5;
wire [15:0]   h2c_6;
wire [15:0]   h2c_7;
//h阵数值v2c
wire [15:0]   h2v_0;
wire [15:0]   h2v_1;
wire [15:0]   h2v_2;
wire [15:0]   h2v_3;
wire [15:0]   h2v_4;
wire [15:0]   h2v_5;
wire [15:0]   h2v_6;
wire [15:0]   h2v_7;
//v2ch（迭代入dpram）
wire [127:0]  v2ch2m_check;
wire [127:0]  v2ch2m_ite;
//v2ch（出dpram）
wire [127:0]  m2v2ch;
//c2vh
wire [15:0]   c2vh_0;
wire [15:0]   c2vh_1;
wire [15:0]   c2vh_2;
wire [15:0]   c2vh_3;
wire [15:0]   c2vh_4;
wire [15:0]   c2vh_5;
wire [15:0]   c2vh_6;
wire [15:0]   c2vh_7;

decode_cntrl u_decode_cntrl(
    //时钟复位
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    //解码使能
    .i_decode_en(i_decode_en),
    //校验结果
    .i_check_ok(check_ok),
    //解码完成和错误
    .o_decode_finish(o_decode_finish),
    .o_decode_error(o_decode_error),
    //控制信号、迭代计数器
    .o_decode_cnt(decode_cnt),
    .o_err_cnt(err_cnt),
    //dpram读地址
    .o_cn_r_addr(cn_r_addr)
);

decode_vn u_decode_vn(
    //时钟复位
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    //解码使能
    .i_decode_en(i_decode_en),
    //控制信号、迭代计数器
    .i_decode_cnt(decode_cnt),
    .i_err_cnt(err_cnt),
    //8个输入数据
    .i_di(i_decode_data),
    //8列后验信息（上一轮）
    .i_lr_last(lr_last),
    //8列c2v
    .i_c2v_0(c2v_0),
    .i_c2v_1(c2v_1),
    .i_c2v_2(c2v_2),
    .i_c2v_3(c2v_3),
    .i_c2v_4(c2v_4),
    .i_c2v_5(c2v_5),
    .i_c2v_6(c2v_6),
    .i_c2v_7(c2v_7),
    //8列校验v2c
    .o_v2c_check_0(v2c_check_0),
    .o_v2c_check_1(v2c_check_1),
    .o_v2c_check_2(v2c_check_2),
    .o_v2c_check_3(v2c_check_3),
    .o_v2c_check_4(v2c_check_4),
    .o_v2c_check_5(v2c_check_5),
    .o_v2c_check_6(v2c_check_6),
    .o_v2c_check_7(v2c_check_7),
    //8列迭代v2c
    .o_v2c_ite_0(v2c_ite_0),
    .o_v2c_ite_1(v2c_ite_1),
    .o_v2c_ite_2(v2c_ite_2),
    .o_v2c_ite_3(v2c_ite_3),
    .o_v2c_ite_4(v2c_ite_4),
    .o_v2c_ite_5(v2c_ite_5),
    .o_v2c_ite_6(v2c_ite_6),
    .o_v2c_ite_7(v2c_ite_7),
    //8列后验信息（下一轮）
    .o_lr_next(lr_next),
    //输出地址数据
    .o_decode_addr(o_decode_addr),
    .o_decode_data(o_decode_data)
);

decode_mulh u_decode_mulh_check(
    //h阵数值
    .i_h_0(h2v_0),
    .i_h_1(h2v_1),
    .i_h_2(h2v_2),
    .i_h_3(h2v_3),
    .i_h_4(h2v_4),
    .i_h_5(h2v_5),
    .i_h_6(h2v_6),
    .i_h_7(h2v_7),
    //v2c数据
    .i_v2c_0(v2c_check_0),
    .i_v2c_1(v2c_check_1),
    .i_v2c_2(v2c_check_2),
    .i_v2c_3(v2c_check_3),
    .i_v2c_4(v2c_check_4),
    .i_v2c_5(v2c_check_5),
    .i_v2c_6(v2c_check_6),
    .i_v2c_7(v2c_check_7),
    //v2ch数据
    .o_v2ch(v2ch2m_check)
);

decode_mulh u_decode_mulh_ite(
    //h阵数值
    .i_h_0(h2v_0),
    .i_h_1(h2v_1),
    .i_h_2(h2v_2),
    .i_h_3(h2v_3),
    .i_h_4(h2v_4),
    .i_h_5(h2v_5),
    .i_h_6(h2v_6),
    .i_h_7(h2v_7),
    //v2c数据
    .i_v2c_0(v2c_ite_0),
    .i_v2c_1(v2c_ite_1),
    .i_v2c_2(v2c_ite_2),
    .i_v2c_3(v2c_ite_3),
    .i_v2c_4(v2c_ite_4),
    .i_v2c_5(v2c_ite_5),
    .i_v2c_6(v2c_ite_6),
    .i_v2c_7(v2c_ite_7),
    //v2ch数据
    .o_v2ch(v2ch2m_ite)
);

decode_check u_decode_check(
    //时钟复位
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    //解码使能
    .i_decode_en(i_decode_en),
    //控制信号
    .i_decode_cnt(decode_cnt),
    //v2ch数据
    .i_v2ch(v2ch2m_check),
    //校验结果
    .o_check_ok(check_ok)
);

decode_check u_decode_ite(
    //时钟复位
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    //解码使能
    .i_decode_en(i_decode_en),
    //控制信号
    .i_decode_cnt(decode_cnt),
    //v2ch数据
    .i_v2ch(v2ch2m_ite),
    //校验方程
    .o_check_ok_all(check_ok_all)
);

decode_cn u_decode_cn(
    //时钟复位
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    //解码使能
    .i_decode_en(i_decode_en),
    //控制信号
    .i_decode_cnt(decode_cnt),
    //v2ch数据
    .i_v2ch(m2v2ch),
    //校验方程
    .i_check_ok_all(check_ok_all),
    //c2vh数据
    .o_c2vh_0(c2vh_0),
    .o_c2vh_1(c2vh_1),
    .o_c2vh_2(c2vh_2),
    .o_c2vh_3(c2vh_3),
    .o_c2vh_4(c2vh_4),
    .o_c2vh_5(c2vh_5),
    .o_c2vh_6(c2vh_6),
    .o_c2vh_7(c2vh_7)
);

decode_divh u_decode_divh(
    //h阵数值
    .i_h_0(h2c_0),
    .i_h_1(h2c_1),
    .i_h_2(h2c_2),
    .i_h_3(h2c_3),
    .i_h_4(h2c_4),
    .i_h_5(h2c_5),
    .i_h_6(h2c_6),
    .i_h_7(h2c_7),
    //c2vh数据
    .i_c2vh_0(c2vh_0),
    .i_c2vh_1(c2vh_1),
    .i_c2vh_2(c2vh_2),
    .i_c2vh_3(c2vh_3),
    .i_c2vh_4(c2vh_4),
    .i_c2vh_5(c2vh_5),
    .i_c2vh_6(c2vh_6),
    .i_c2vh_7(c2vh_7),
    //c2v数据
    .o_c2v_0(c2v_0),
    .o_c2v_1(c2v_1),
    .o_c2v_2(c2v_2),
    .o_c2v_3(c2v_3),
    .o_c2v_4(c2v_4),
    .o_c2v_5(c2v_5),
    .o_c2v_6(c2v_6),
    .o_c2v_7(c2v_7)
);
//lr dpram 0~287 512
decode_dpram_lr u_decode_dpram_lr(
    .i_r_clk(i_clk),
    .i_w_clk(i_clk),
    .i_r_en(1'b1),
    .i_w_en(1'b1),
    .i_r_addr(decode_cnt),
    .i_w_addr(decode_cnt-9'd2),
    .i_w_data(lr_next),
    .o_r_data(lr_last)  
);
//v2ch dpram 0~287 128
decode_dpram_v2ch u_decode_dpram_v2ch(
    .i_r_clk(i_clk),
    .i_w_clk(i_clk),
    .i_r_en(1'b1),
    .i_w_en(1'b1),
    .i_r_addr(cn_r_addr),
    .i_w_addr(decode_cnt-9'd2),
    .i_w_data(v2ch2m_ite),
    .o_r_data(m2v2ch)  
);
//h阵rom v2c
rom_h u_rom_h_v2c(
    .i_decode_cnt(decode_cnt-1'b1),
    .o_h_0(h2v_0),
    .o_h_1(h2v_1),
    .o_h_2(h2v_2),
    .o_h_3(h2v_3),
    .o_h_4(h2v_4),
    .o_h_5(h2v_5),
    .o_h_6(h2v_6),
    .o_h_7(h2v_7)
);
//h阵rom c2v
rom_h u_rom_h_c2v(
    .i_decode_cnt(decode_cnt),
    .o_h_0(h2c_0),
    .o_h_1(h2c_1),
    .o_h_2(h2c_2),
    .o_h_3(h2c_3),
    .o_h_4(h2c_4),
    .o_h_5(h2c_5),
    .o_h_6(h2c_6),
    .o_h_7(h2c_7)
);

endmodule
